package models

import (
	"time"

	"gorm.io/gorm"
)

// Item 项目模型
type Item struct {
	ID          int     `json:"id" gorm:"primaryKey;autoIncrement"`
	Code        *string `json:"code" gorm:"type:varchar(50);uniqueIndex;comment:项目代码"`
	Name        string  `json:"name" gorm:"type:varchar(100);not null"`
	Description *string `json:"description" gorm:"type:text"`
	Icon        string  `json:"icon" gorm:"type:varchar(255)"`

	ContentType   string         `json:"content_type" gorm:"type:varchar(50);not null;index;comment:内容类型"`
	APIEndpoint   *string        `json:"api_endpoint" gorm:"type:varchar(255)"`
	PagePath      *string        `json:"page_path" gorm:"type:varchar(255)"`
	ExternalURL   *string        `json:"external_url" gorm:"type:varchar(500)"`
	ComponentName *string        `json:"component_name" gorm:"type:varchar(100)"`
	Content       *string        `json:"content" gorm:"type:longtext"`
	ParentID      *int           `json:"parent_id" gorm:"index"`
	DisplayOrder  int            `json:"display_order" gorm:"default:0;index"`
	IsSmall       bool           `json:"is_small" gorm:"default:false;comment:是否为小图标"`
	Params        *string        `json:"params" gorm:"type:json;comment:额外参数"`
	Status        int            `json:"status" gorm:"default:1;index;comment:状态 1-启用 0-禁用"`
	CreatedAt     time.Time      `json:"created_at"`
	UpdatedAt     time.Time      `json:"updated_at"`
	DeletedAt     gorm.DeletedAt `json:"-" gorm:"index"`

	// 关联关系
	Parent   *Item  `json:"parent,omitempty" gorm:"foreignKey:ParentID;references:ID;constraint:OnUpdate:CASCADE,OnDelete:SET NULL"`
	Children []Item `json:"children,omitempty" gorm:"foreignKey:ParentID;references:ID;constraint:OnUpdate:CASCADE,OnDelete:SET NULL"`

	// 多对多关联关系
	Categories []Category `json:"categories,omitempty" gorm:"many2many:category_items;"`
	
	// 页面项目关联关系（当 content_type 为 page 时使用）
	// 作为页面项目时，关联的其他项目
	RelatedItems []Item `json:"related_items,omitempty" gorm:"many2many:page_items;joinForeignKey:PageItemID;joinReferences:ItemID;"`
	// 作为普通项目时，被哪些页面项目关联
	PageItems []Item `json:"page_items,omitempty" gorm:"many2many:page_items;joinForeignKey:ItemID;joinReferences:PageItemID;"`

	// 计算字段
	HasChildren bool `json:"has_children,omitempty" gorm:"-"`
}

// TableName 指定表名
func (Item) TableName() string {
	return "items"
}

// BeforeCreate GORM钩子 - 创建前
func (i *Item) BeforeCreate(tx *gorm.DB) error {
	// 可以在这里添加创建前的逻辑
	return nil
}

// BeforeUpdate GORM钩子 - 更新前
func (i *Item) BeforeUpdate(tx *gorm.DB) error {
	// 可以在这里添加更新前的逻辑
	return nil
}

// AfterFind GORM钩子 - 查询后
func (i *Item) AfterFind(tx *gorm.DB) error {
	// 计算是否有子项目
	var count int64
	tx.Model(&Item{}).Where("parent_id = ?", i.ID).Count(&count)
	i.HasChildren = count > 0
	return nil
}
